package top.lshaci.learning.rule;

import java.util.Optional;

/**
 * AbstractRule
 *
 * @param <C> 参数转换后的类型
 * @param <R> 返回值类型
 * @param <P> 参数类型
 * @param <T> 规则类型
 * @author lshaci
 * @since 1.0.0
 */
public abstract class AbstractRule<C, R, P, T> implements BaseRule<R, P, T> {

    protected abstract C convert(P param);

    @Override
    public R exec(P param) {
        return doExec(Optional.ofNullable(convert(param)));
    }

    protected abstract R doExec(Optional<C> data);
}
